DoctrineのEntity Manager
Entityを管理するobject
DBとEntityの仲介をする
コード内では$emという名前で変数に入れられる事が多い
DBに保存する流れ
Entityをinstantiateして、それに対してゴニョって値の更新などを行う
新しくなったEntityがDoctrineの管理下に入る
元のEntityとの差分などを管理している
差分を実際にDBに適用する
SQLを発行してごにょごにょというのを勝手にやっている
このタイミングで初めてDBが更新される
code:ノリ.php
$inquiry = new InruiryEntity();
$inquiry->setName('hoge'); // Entityを更新
..
$em = $this->getDoctrine()->getManager(); // entity managerを取得
$em->persist($inquiry); // emに入れる
$em->flush(); // DBを更新
DBから読み込むときの流れ
DBに入っていることを意識せず、Entity Managerに入っているものとして扱う
repositoryを取得
repositoryに対してfindなどをする
code:ノリ.php
$em = $this->getDoctrine()->getManager(); // entity managerを取得
$hogeRepository = $em->getRepository('Hoge');
$list = $hogeRepository->find(...);
flush()の引数
この辺の処理が混在してしまいがちmrsekut.icon
①object単体の構築
②object同士の関連付け
特にコレの挿し込みが邪魔mrsekut.icon
こういうやつ
code:php
$product = new Product(); // ①
$product->setName('Example Product'); // ①
$entityManager->persist($product); // ③
foreach ($images as $image) {
$productImage = new ProductImage(); // ①
$productImage->setFileName($image->getFileName()); // ①
$productImage->setProduct($product); // ②
$entityManager->persist($productImage); // ③
}
$entityManager->flush(); // ④
①と②はOOPをやっている上、密になるのは仕方ないとして、
③や④はobject構築とは別の話なので、別の場所に書けるべき
上記のコードだと、for loopの中で③をしないといけないのがかなりダメ
パイプライン処理的に、① | ② | ③ | ④と書くことが難しい
できるけど変に冗長になる
phperはあまり気にしてなさそうだけど(?)